<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title></title>
	<link rel="stylesheet" href="">
</head>
<body>
	<script type="text/javascript">
		{
			//当做函数
			class Father{
				constructor(){
					console.log(new.target.name);
				}
			}

			class Son extends Father{
				constructor(){
					super();//当做函数的使用的时候，1.执行父类的constructor方法。
					this.a = 10;//2.把this指向子类的实例
					//Father.prototype.constructor.call(this);
				}

				method(){
					//super();//规定了super只能在constructor里面执行
				}
			}
			new Father();
			new Son();
		}

		console.log('----------------------super当做函数使用---------------');

		{
			class Father{
				constructor(){
					this.a = '父类实例a';
					this.b = '父类实例b';
				}

				showB(){
					console.log(`这是父类身上的共享方法，并且弹出${this.b}`);
				}

				static showB(){//这是个私有方法，名字与上面一样，互不影响。
					console.log(`这是父类上身的私有方法，并且会弹出${this.b}`);
				}
			}

			Father.prototype.a = '父类原型的a';
			Father.prototype.b = '父类原型的b';

			class Son extends Father{
				constructor(){//普通函数
					super();//这里的super是个方法，
					this.b = '子类实例的b';

					super.b = 'super就是this';//super操作属性，super就是this(子类的实例)
					console.log(super.b);//supper用来获取，依然指向父类的原型

					/**
					 * 这里的super是一个对象，因为是在普通函数的里去去用
					 * 1.super指向父类的原型对象
					 * 2.方法里的this指向子类的实例
					 */
					super.showB();//

					//调用属性
					console.log(super.a);//父类圆形的a
				}
			}

			Son.b = '子类私有属性b';

			new Son();

		}

		console.log('----------------------super当做对象普通函数中---------------');

		{
			//当做对象使用（在私有方法中）
			class Father{
				constructor(){
					this.b = '父类实例b';
				}

				showB(){
					console.log(`这是父类身上的共享方法，并且弹出${this.b}`);
				}

				static showB(){//这是个私有方法，名字与上面一样，互不影响。
					console.log(`这是父类上身的私有方法，并且会弹出${this.b}`);
				}
			}

			Father.prototype.a = '父类原型的a';
			Father.prototype.b = '父类原型的b';

			class Son extends Father{
				constructor(){//普通函数
					super();//这里的super是个方法，
					this.b = '子类实例的b';
				}

				static log(){
					/*
					 * 1.这里的super指向父类，并不是父类的原型
					 * 2.方法里的this被改成了子类而不是子类的实例
					 * 
					 */
					super.showB();
				}
			}
			Son.b = '子类私有属性b';
			Son.log();
		}

		//super在用的时候一定要执行做为什么去使用
		{
			class Father{};
			class Son extends Father{
				constructor(){
					super();
					console.log(super.b);//这了一定要执行super的类型
				}
			}
		}
	</script>
</body>
</html>